package com.linkgie.galaxyframework.utils.regex;

import java.util.regex.Pattern;

/**
 * 常用格式；
 * 
 * @author huanghaiquan
 *
 */
public final class Regexes {

	/**
	 * 简单命名规则的正则表达式；：只包含数字、字母、下划线、减号；
	 */
	public static final String SIMPLE_NAMED_REGEX = "^[a-zA-Z_0-9\\-]+";

	/**
	 * IP V4 格式的正则表达式；
	 */
	public static final String IP_V4_REGEX = "[0-9]{1,3}[\\.][0-9]{1,3}[\\.][0-9]{1,3}[\\.][0-9]{1,3}";

	/**
	 * 国内移动电话号码的正则表达式；
	 */
	public static final String MOBILE_NUMBER_REGEX = "1[3-9][0-9]{9}";

	/**
	 * 国内固定电话号码的正则表达式；
	 */
	public static final String PHONE_NUMBER_REGEX = "0[1-9][0-9]{1,2}-[1-9][0-9]{6,7}";

	/**
	 * 国内移动或固定电话号码的正则表达式；
	 */
	public static final String TEL_NUMBER_REGEX = "(" + MOBILE_NUMBER_REGEX + ")|(" + PHONE_NUMBER_REGEX + ")";

	/**
	 * 汉字字符；
	 * <p>
	 * 包括简繁体；
	 */
	public static final String ZH_CHARACTERS_REGEX = "[\u4e00-\u9fa5]+";

	/**
	 * 邮箱的正则表达式；
	 * <p>
	 * 
	 * 允许中文字符以及中文域名；
	 */
	public static final String EMAIL_REGEX = "^[_\\-A-Za-z0-9\u4e00-\u9fa5]+@[_\\-A-Za-z0-9\u4e00-\u9fa5]+(\\.[_\\-A-Za-z0-9\u4e00-\u9fa5]+)+$";

	/**
	 * 简单的日期格式：年-月-日；如：“2021-09-10”;
	 */
	public static final String SIMPLE_DATE_FORMAT = "yyyy-MM-dd";

	/**
	 * 简单的日期时间格式：年-月-日 时:分:秒；如：“2021-09-10 16:01:59”;
	 */
	public static final String SIMPLE_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 紧凑的日期格式：年月日；如：“20210910”;
	 */
	public static final String COMPACT_DATE_FORMAT = "yyyyMMdd";

	/**
	 * 紧凑的日期时间格式：年月日时分秒；如：“20210910160159”;
	 */
	public static final String COMPACT_DATETIME_FORMAT = "yyyyMMddHHmmss";

	// ---------------------

	private static Pattern MOBILE_NUMBER_PATTERN = Pattern.compile(MOBILE_NUMBER_REGEX);

	private static Pattern PHONE_NUMBER_PATTERN = Pattern.compile(PHONE_NUMBER_REGEX);

	private static Pattern TEL_NUMBER_PATTERN = Pattern.compile(TEL_NUMBER_REGEX);

	private static Pattern ZH_CN_CHARS_PATTERN = Pattern.compile(ZH_CHARACTERS_REGEX);

	private static Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX);

	/**
	 * 检查是否为有效的国内移动电话号码；
	 * 
	 * @param text
	 * @return
	 */
	public static boolean isMobileNumber(CharSequence text) {
		if (text == null) {
			return false;
		}
		return MOBILE_NUMBER_PATTERN.matcher(text).matches();
	}

	/**
	 * 是否为国内固定电话号码；
	 * 
	 * @param text
	 * @return
	 */
	public static boolean isPhoneNumber(CharSequence text) {
		if (text == null) {
			return false;
		}
		return PHONE_NUMBER_PATTERN.matcher(text).matches();
	}

	/**
	 * 是否为国内移动电话或固定电话号码；
	 * 
	 * @param text
	 * @return
	 */
	public static boolean isTelNumber(CharSequence text) {
		if (text == null) {
			return false;
		}
		return TEL_NUMBER_PATTERN.matcher(text).matches();
	}

	/**
	 * 是否为汉字字符，包括简体、繁体，但不包括标点符号；
	 * 
	 * @param text
	 * @return
	 */
	public static boolean isZhChars(CharSequence text) {
		if (text == null) {
			return false;
		}
		return ZH_CN_CHARS_PATTERN.matcher(text).matches();
	}

	/**
	 * 是否为邮箱；
	 * <p>
	 * 
	 * 允许中文字符以及中文域名；
	 * 
	 * @param text
	 * @return
	 */
	public static boolean isEmail(CharSequence text) {
		if (text == null) {
			return false;
		}
		return EMAIL_PATTERN.matcher(text).matches();
	}

}
